package com.niit.scala

object Base_08 {

  def main(args: Array[String]): Unit = {
    /*
       1.模式匹配
        1.简单模式匹配
        2.匹配类型
        3.模式匹配的守卫
        4.匹配样例类
        5.匹配集合
        7.匹配for循环表达式
       2.Option类型
       柯里化

     */
    //简单模式匹配  switch - case
    //  需求：输入Hadoop或者Spark，分别显示两者的简介信息，如果输入其他的则显示未匹配
    var str = "HBase"
    var res = str match {
      case "Hadoop" => "大数据分布式存储和计算框架"
      case "Spark" => "大数据分布式内存计算框架"
      case _ => "未匹配"
    }
    println(res)
    //匹配类型
    val i:Any = 999  //用Any
    i match {
      case i:String => println("字符串")
      case _:Int => println("这是一个Int")
      case _:Double => println("这是一个Double")
      case _ => println("未知类型")
    }

    //模式匹配的守卫
    //输入一个数，获得这个数所在的区间
    val num = 3
    num match {
      case num if num >=0 && num<=10 => println("这个数在0-10的范围")
      case num if num>11 && num <=20 =>   println("这个数在11-20的范围")
      case _ =>   println("超出范围")
    }

    //匹配样例类
    //通过match进行模式匹配，要匹配的对象类型必须是Any
    var c:Any =Customer("张三",23)
    var o:Any = Order(12345)
    var arr:Any = Array(1,2)
    arr match {
      case Customer(a,b) => println("这是客户样例类")
      case Order(c) => println("这是订单样例类")
      case _ => println("未匹配")
    }
    //匹配集合 数组/列表
    var arr1 = Array(1,2,3)
    var arr2 = Array(0)
    var arr3 = Array(1,2,3,4,5)
    arr3 match {
      //匹配：长度为3 首元素为 1
      case Array(1,x,y) => println("长度为3 首元素为 1")
      //匹配：只有一个元素，且为0
      case Array(0) => println("只有一个元素，且为0")
      //匹配：首元素为1 后面元素无所谓
      case Array(1,_*) => println("元素为1 后面元素无所谓")
       //匹配:长度2
      case Array(x,y) => println("匹配长度2")
      case _ => println("未匹配")
    }

    //匹配for表达式
    //定义变量记录学生的年龄和姓名，获得年龄为23的学生信息
    var students = Map ( ("张三",23),("李四",24),("王五",25)  )
    //传统写法
    for ( (k,v) <- students if v==23 ){
      println(k,v)
    }
    //固定值写法
    for(  (k,23) <- students){
      println(k,23)
    }

    //Option类型:用来避免空指针异常，具体值使用Some(x) 空值使用None

    divide(10,2)match {
      case None => println("除数不能为0")
      case Some(x) => println(s"结果为${x}")
    }

    //柯里化 [了解]： 将原先接收多个参数的方法 转换为多个只有一个参数列表的过程
    //需求 定义方法完成两个字符串的拼接
    println( merge2("abc","def")(_+_) )

  }
  def merge1(str1:String,str2:String)                              :String = str1 +str2
  // 柯里化的方式
  def merge2(str1:String,str2:String) (f1:(String,String) => String):String =f1(str1,str2)



  def divide(a:Int,b:Int):Option[Int]={
    if(b==0){
      None
    }else{
      Some(a/b)
    }
  }


case class Customer(var name:String,var age:Int)
case class Order(var id:Int)
}
